package com.maxlen.camunda.service;

import com.maxlen.camunda.entity.CamundaFormEntity;
import com.maxlen.camunda.entity.dto.*;
import com.maxlen.camunda.entity.vo.*;
import com.tcloudit.common.core.web.domain.PageEntity;
import com.tcloudit.common.core.web.page.TableDataInfo;
import com.tcloudit.system.api.domain.CamundaUserPost.SelectUserVO;

import java.util.List;

public interface CamundaService {

    /**
     * 根据Key获取所有版本的流程定义列表
     * @param page 分页搜索参数
     * @return 结果
     */
    TableDataInfo getProcessDefinition(PageEntity<String> page);

    /**
     * 删除所有版本的流程定义
     *
     * @param processKey 流程定义Key
     */
    void removeProcessDefinition(String[] processKey);

    /**
     * 根据部署ID删除流程定义
     * @param deploymentId 流程定义ID
     * @return 结果
     */
    int removeProcessDefinitionByDeploymentId(String[] deploymentId);

    /**
     * 获取对应部署ID的BPMN模型
     * @param deploymentId 部署ID
     * @return 结果
     */
    String getProcessBpmn(String deploymentId);

    /**
     * 更新流程定义的状态
     * @param key 流程状态标识
     * @return 结果
     */
    int updateProcessStatus(String key);

    /**
     * 发布工作流程
     * @param id bpmn表 id
     */
    void createProcessDefinition(String id) throws Throwable;

    /**
     * 获取流程定义监控列表
     * @param page 分页和检索
     * @return 结果
     */
    TableDataInfo getProcessControl(PageEntity<ProcessControlKeyDTO> page);

    /**
     * 删除流程定义监控
     * @param processInstanceIds 流程定义ID集合
     * @return 结果
     */
    int deleteProcessControl(String[] processInstanceIds);

    /**
     * 获取流程的表单
     * @param processInstanceId 流程定义ID
     * @return 结果
     */
    ProcessFormVO getProcessForm(String processInstanceId);

    /**
     * 获取流程的审批意见
     * @param processInstanceId 流程定义ID
     * @return 结果
     */
    List<ProcessCommentVO> getProcessComment(String processInstanceId);

    /**
     * 获取需要展示的流程图
     * @param processInstanceId 流程定义ID
     * @return 结果
     */
    ProcessBpmnVO getProcessShowBpmn(String processInstanceId);

    /**
     * 获取当前部署流程的节点的权限
     * @param taskId 任务ID
     * @return 结果
     */
    List<String> getProcessAuth(String taskId);

    /**
     * 完成任务
     * @param taskCompleteDTO 参数
     * @return R
     */
    int completeTask(TaskCompleteDTO taskCompleteDTO);

    /**
     * 加签
     * @param signDTO 加签请求参数
     * @return 结果
     */
    int addSign(SignDTO signDTO);

    /**
     * 获取加签的选人列表
     * @param taskId 任务ID
     * @return 结果
     */
    List<SelectUserVO> selectAddSignUser(String taskId);

    /**
     * 获取办理的选人列表
     * @param taskId 任务ID
     * @return 结果
     */
    SelectCompleteUserVO selectCompleteUser(String taskId);

    /**
     * 获取减签的选人列表
     * @param taskId 任务ID
     * @return 结果
     */
    List<SelectUserVO> selectDeleteSignUser(String taskId);

    /**
     * 减签
     * @param signDTO 参数
     * @return 结果
     */
    int deleteSign(SignDTO signDTO);

    /**
     * 委托
     * @param delegateDTO 参数
     * @return 结果
     */
    int delegate(DelegateDTO delegateDTO);

    /**
     * 解决委托任务
     * @param taskCompleteDTO 任务完成参数
     * @return 结果
     */
    int completeDelegate(TaskCompleteDTO taskCompleteDTO);

    /**
     * 取消委托
     * @param opinionDTO 任务ID、意见
     * @return 结果
     */
    int cancelDelegate(OpinionDTO opinionDTO);

    /**
     * 转办
     * @param delegateDTO 任务ID、用户ID、意见
     * @return 结果
     */
    int relayComplete(DelegateDTO delegateDTO);

    /**
     * 退回到上一步的任务
     * @param opinionDTO 任务ID、意见
     * @return 结果
     */
    int returnBackTask(OpinionDTO opinionDTO);

    /**
     * 设计模板页面，获取选人列表
     * @param choseDTO 已选中的用户
     * @return 结果
     */
    SelectCompleteUserVO getChoseUser(ChoseDTO choseDTO);

    /**
     * 设计模板页面，获取权限列表
     * @param choseDTO 已选中权限
     * @return 结果
     */
    AuthChoseVO getChoseAuth(ChoseDTO choseDTO);

    /**
     * 设计模板页面，获取表达式列表
     * @return 结果
     */
    List<ConditionChoseVO> getChoseCondition();

    /**
     * 设计模板页面，根据表单标识获取表单中的变量
     * @param formList 表单标识集合
     * @return 结果
     */
    List<CamundaFormEntity.Components> getFormVariable(List<String> formList);

    /**
     * 获取用户任务列表
     * @return 结果
     */
    TableDataInfo getUserTask(PageEntity<ProcessControlKeyDTO> page);

    /**
     * 根据当前用户获取用户任务列表
     * @param page 分页与检索
     * @return 结果
     */
    TableDataInfo getUserTaskByUser(PageEntity<ProcessControlKeyDTO> page);

    /**
     * 根据当前用户获取发出委托的用户任务列表
     * @param page 分页与检索
     * @return 结果
     */
    TableDataInfo getDelegateTaskByUser(PageEntity<ProcessControlKeyDTO> page);

    /**
     * 根据当前用户获取具有的流程
     * @return 结果
     */
    List<ProcessByUserIdVO> getProcessByUserId();

    /**
     * 获取流程的开始表单
     * @param processVersionDTO 流程Key与版本
     * @return 结果
     */
    String getProcessStartForm(ProcessVersionDTO processVersionDTO);

    /**
     * 根据流程Key和版本号获取流程模型
     * @param processVersionDTO 流程Key与版本号
     * @return 结果
     */
    String getProcessBpmnByVersion(ProcessVersionDTO processVersionDTO);

    /**
     * 根据流程Key和版本号开启流程
     * @param startProcessVersionDTO 流程Key与版本
     * @return 结果
     */
    ProcessInstanceTitleVO startProcessByVersion(StartProcessVersionDTO startProcessVersionDTO);

    /**
     * 获取流程的第一个节点的选人列表
     * @param startProcessVersionDTO 流程Key与版本
     * @return 结果
     */
    List<SelectUserVO> getStartProcessUserList(StartProcessVersionDTO startProcessVersionDTO);

    /**
     * 获取流程定义的变量
     * @param processInstanceId 流程定义ID
     * @return 结果
     */
    List<ProcessVariableVO> getProcessVariable(String processInstanceId);

    /**
     * 获取流程审批日志流程
     * @param processInstanceId 流程定义ID
     * @return 结果
     */
    ProcessCommentLogVO getProcessCommentLog(String processInstanceId);

    /**
     * 获取流程流转步骤
     * @param processInstanceId 流程定义ID
     * @return 结果
     */
    List<ProcessNodeLogVO> getProcessNodeLog(String processInstanceId);

}
